package com.wkbb.basic.service;

import com.wkbb.common.dto.basic.ClassInfo;
import com.wkbb.basic.model.Employee;
import com.wkbb.basic.model.TeacherCourse;
import com.wkbb.basic.model.User;
import com.wkbb.basic.vo.ClassManageEditVo;
import com.wkbb.basic.vo.TeacherCourseVo;
import com.wkbb.common.base.BaseService;
import com.wkbb.common.dto.ResultDTO;
import com.wkbb.common.dto.basic.ClassInfoDto;
import com.wkbb.common.dto.basic.FamilyInfoDto;
import com.wkbb.common.dto.basic.ImRepairClassMasterDto;
import com.wkbb.common.dto.im.GroupUserInfoDto;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @author Alger Yang
 */
public interface ClassInfoService extends BaseService<ClassInfo> {

    /**
     * 删除班级
     *
     * @param ids      班级ID
     * @param updateBy 修改人
     * @throws Exception 抛出异常
     */
    ResultDTO delete(List<Long> ids, String updateBy) throws Exception;

    /**
     * 获取班级详情
     *
     * @param id 班级ID
     * @return 班级详情
     * @throws Exception 抛出异常
     */
    ClassInfo getInfo(Long id) throws Exception;

    /**
     * 新增任课教师
     *
     * @param masterId   教师ID
     * @param classInfo  班级信息
     * @param courseName 课程名称
     * @throws Exception 抛出异常
     */
    void addTeacherCourse(List<Long> masterId, ClassInfo classInfo, String courseName) throws Exception;

    /**
     * 删除任课教师
     *
     * @param courseId 课程ID
     * @throws Exception 抛出异常
     */
    void deleteTeacherCourse(Long courseId) throws Exception;

    /**
     * 获取是否班主任
     *
     * @param userId 用户ID
     * @return 用户为班主任的班级信息
     * @throws Exception 抛出异常
     */
    ClassInfo getClassMasterIsTrue(Long userId) throws Exception;

    /**
     * 通过班主任ID获取班级信息
     *
     * @param userId 用户ID
     * @return 班级信息
     * @throws Exception 抛出异常
     */
    ClassInfoDto getClassInfoByMasterId(Long orgId,Long userId) throws Exception;

    /**
     * 获取任课教师列表
     *
     * @param params 参数
     * @return 认可教师列表
     * @throws Exception 抛出异常
     */
    List<TeacherCourse> getTeacherCourse(Map<String, Object> params) throws Exception;

    /**
     * 自动创群,自动新增成员接口
     *
     * @param type 1.老师,2家长
     * @param flag 自动创群
     * @throws Exception 抛出异常
     */
    String getAutoGroupFeign(Integer type, Boolean flag, Long userId, String className, Long orgId, Long classId, Long studentId);

    void addClass(ClassInfo classInfo, List<TeacherCourseVo> teacherCourseList) throws Exception;

    /**
     * 新增班级（同时可以添加任课教师）
     *
     * @param classInfo         班级信息
     * @param teacherCourseList 任课教师
     */
    String insert(ClassInfo classInfo, List<TeacherCourseVo> teacherCourseList) throws Exception;

    /**
     * 更新班级信息
     *
     * @param classInfo 班级信息
     * @param isBack    是否后台
     * @throws Exception 抛出异常
     */
    @Transactional(rollbackFor = Exception.class)
    void update(ClassInfo classInfo, boolean isBack) throws Exception;

    /**
     * 更新班级（同时更新任课教师）
     *
     * @param classInfo         班级信息
     * @param teacherCourseList 任课教师
     * @param isBack            是否后台
     */
    void update(ClassInfo classInfo, List<TeacherCourseVo> teacherCourseList, boolean isBack) throws Exception;

    /**
     * 通过班级ID获取班级信息以及其携带的班级
     *
     * @param classId 班级ID
     * @return 班级管理视图对象
     */
    ClassManageEditVo getClassInfoWithCoursesById(Long classId);

    /**
     * 通过组织ID获取有班主任的班级信息
     *
     * @param orgId 组织ID
     * @return 有班主任的班级信息
     */
    List<ClassInfo> getClassMasterListByOrgId(Long orgId);

    /**
     * 通过负责人用户ID删除任课信息
     *
     * @param userId 负责人用户ID
     */
    void deleteTeacherCourseByMasterId(Long userId);

    /**
     * 更新班级班主任信息
     *
     * @param user     用户信息
     * @param updateBy 操作人
     */
    void updateMaster(User user, String updateBy);

    boolean autoCreateChatGroup(Long orgId);

    List<ClassInfoDto> getNewClassListByOldIds(List<Long> oldClassIds);

    /**
     * 封装任课老师信息,并且自动加入IM群
     *
     * @param orgId    学校ID
     * @param classId  班级ID
     * @param teacherCourseList  任课老师对象
     */
    void saveAutoGroupUserTeacherCourse(Long orgId,Long classId,List<TeacherCourseVo> teacherCourseList,Boolean flag,String imGroupId);

    /**
     * 封装所有园长信息,并且自动加入IM群
     *
     * @param orgId    学校ID
     * @param userType  用户类型ID
     */
    void saveAutoGroupUserMaster(Long orgId, Short userType, Long classId,Employee employee,User user)throws Exception;

    /**
     * 封装单个园长信息,并且自动加入IM群
     *
     * @param orgId    学校ID
     * @param userType  用户类型ID
     */
     void saveAutoGroupUserMasterOne(Long orgId, Short userType, Employee newEmployee,User newUser) throws Exception;

    /**
     * 用户转任课老师
     *
     * @param orgId    学校ID
     * @param userId  园长ID
     * @param classId  班级ID
     */
     void userIdSwictch(Long userId,Long orgId,Long classId,String imGroupId);

    /**
     * 家长自动入群
     */
    void saveAutoGroupUserFamily(List<FamilyInfoDto> familyInfoListByClassIdList);

    /**
     *  更换负责人时更换群主
     * @param newMasterId  新的负责人ID
     * @param newOrgId  新的学校ID
     * @param oldMasterId  老的负责人ID
     */
    void makeOverGroup(Long newMasterId,Long newOrgId, Long oldMasterId);

    List<GroupUserInfoDto> getGroupUserInfoDtoList(Long orgId, Long classId, Long userId, Long studentId,Integer userType);

    /**
     * 家长自动入群
     *
     * @param orgId    学校ID
     * @param classMasterId  用户ID
     * @param classId  班级ID
     * @param flag  入群:true,退群:flag
     * @param imGroupId  入群:true,退群:flag
     */
    void saveAutoClassMasterId(Long orgId, Long classId,Long classMasterId,Boolean flag,String imGroupId);

    /**
     * 家长自动入群
     *
     * @param classInfo   班级信息
     * @param teacherCourseList  任课老师信息
     * @param autoGroupFeign  IM群信息
     */
    void saveClassAutoInfo(ClassInfo classInfo, List<TeacherCourseVo> teacherCourseList, String autoGroupFeign) throws Exception;

    void deleteByOrgId(Long orgId);

    /**
     * 任课老师入群封装,数据迁移使用
     *
     * @param classInfo   班级信息
     * @param masterId  用户ID
     * @param orgId  学校ID
     */
    void imTeacherCourse(Long masterId,ClassInfo classInfo,Long orgId,Boolean isDelete);

    List<ClassInfoDto>  getCpClassListByOrg(Map<String, Object> params);

    List<Long> getClassIdList();

    void repairImClassGroupInfoALL(List<Long> classIds);

    List<ImRepairClassMasterDto> getMasterAndTeacherCourseNum();

    List<Long> getMasterAndTeacherCourse(Long id);

    void upClass(Long orgId,Long newGradeId,Long classId,String className,Long masterId,String operateUser);

    ClassInfo getByMapParams(Long orgId,String className);

    List<GroupUserInfoDto> getRepairFamilyList(List<FamilyInfoDto> familyInfoListByClassIdList);
    
    
    ClassInfo getClassByInviteCode(String InviteCode) ;
    
    void upGradeClass(Long orgId,Long gradeId,Long classId,String operateUser) throws Exception;

    ResultDTO<Boolean> joinClassByStudents(String studentIds, Long classId,int type);

    ResultDTO<Boolean> joinClassByStudentsBack(String studentIds, Long classId, int i);

    Map<String, Object> getClassAndGradeCount(Map<String, Object> params);

}
